/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package optimizacion;

import java.text.NumberFormat;
import java.util.Random;
import optimizacion.distribuciones.MersenneTwisterFast;

/**
 *
 * @author ricardo
 */
public class Principal {

    BusquedaTabu buscador = new BusquedaTabu();
    int replicas = 50;
    private Resultado r1;
    private Resultado r2;

    public void resolver() {
        Resultado r;
        double sumaG = 0, sumaV = 0, sumaP = 0;
        double suma2G = 0, suma2V = 0, suma2P = 0;
                MersenneTwisterFast ms = new MersenneTwisterFast();

        for (int i = 0; i < replicas; i++) {
            int a=ms.nextInt(41);
            int ca=42-a;
            int b= ms.nextInt(500);
            int cb=501-b;   
                    
            r1 = buscador.search(a+80,b+1);
            r2=buscador.search(ca+80,cb+1);
            r=new Resultado();
            r.ganancia=(r1.ganancia+r2.ganancia)/2;
            r.ventaTajadas=(r1.ventaTajadas+r2.ventaTajadas)/2;
            r.panes=(r1.panes+r2.panes)/2;
            sumaG += r.ganancia;
            suma2G += r.ganancia * r.ganancia;
            sumaV += r.ventaTajadas;
            suma2V += r.ventaTajadas * r.ventaTajadas;
            sumaP += r.panes;
            suma2P += r.panes * r.panes;
        }
        double mediaG = calcularMedia(sumaG, replicas);
        double mediaV = calcularMedia(sumaV, replicas);
        double mediaP = calcularMedia(sumaP, replicas);
        generarIntervalo(mediaG, calVar(suma2G, mediaG), "Ganancias promediadas diarias = ", NumberFormat.getCurrencyInstance());
        generarIntervalo(mediaV, calVar(suma2V, mediaV), "Precio promedio diario de venta Tajadas de pan = ", NumberFormat.getCurrencyInstance());
        generarIntervalo(mediaP, calVar(suma2P, mediaP), "Numero promedio diario de Panes a comprar = ", null);
    }

    private double calcularMedia(double suma, int k) {
        double mediaR = suma / k;
        return mediaR;
    }

    private double calVar(double suma2, double mediaR) {
        return (suma2 - replicas * mediaR * mediaR) / (replicas - 1);
    }

    private void generarIntervalo(double mediaR, double varianzaR, String titulo, NumberFormat f) {
        double raizV = Math.sqrt((varianzaR / replicas));
        double pt = DistLib.t.quantile((1 - 0.05 / 2), replicas - 1);
        double error = pt * raizV;
        double limiteInferior = mediaR - error;
        double limiteSuperior = mediaR + error;
        imprimir(titulo, limiteInferior, limiteSuperior, f, mediaR);
    }

    private void imprimir(String titulo, double limiteInferior, double limiteSuperior, NumberFormat f, double mediaR) {
        if (f != null) {
            System.out.println(titulo + f.format(mediaR));
            System.out.println("Intervalo de confianza 95% = [ " + f.format(limiteInferior) + ", " + f.format(limiteSuperior) + " ]");

        } else {
            System.out.println(titulo + "" + mediaR);
            System.out.println("Intervalo de confianza 95% = [ " + (limiteInferior) + ", " + (limiteSuperior) + " ]");

        }

    }

    public static void main(String[] args) {
        Principal p=new Principal();
                p.resolver();
    }
}
